package cellular;

public class Berechnung {
	
	private int[][] ergebnis;
	private int hoehe;
	private int breite;
	
	Berechnung () {
		hoehe = 1;
		breite = 1;
		ergebnis = new int[1][1];
	}
	
	public void calculate(int generationen) {
		hoehe = generationen + 1; //entspricht der Hoehe des arrays
		
		double breiteD = hoehe * 2 - 1; //Breite des arrays wird errechnet
		double mitteD = breiteD / 2 - 0.5; //Mitte des arrays
		
		breite = (int) breiteD; //umcasten in einen Integer fuer Umgang mit array
		int mitte = (int) mitteD; //umcasten in einen Integer fuer Umgang mit array
		
		ergebnis = new int [hoehe][breite]; //initianilisieren des arrays
		
		ergebnis [0][mitte] = 1; //Mitte wird schwarz gefaerbt
		
		for(int schritt = 0; schritt < hoehe-1; schritt++){
	
			for(int zelle = mitte - schritt -1; zelle <= mitte + schritt + 1; zelle++){ 
				
				int vgl1 = zelle -1; //Bestimmung der Position fuer links
				int vgl2 = zelle +1; //Bestimmung der Position fuer rechts
				
				if(vgl1 < 0){
					vgl1 = 0;
				} //Workaround, damit nicht auf ein Kaestchen ausserhalb des arrays zugegriffen wird
				
				if(vgl2 == breite){
					vgl2 = zelle;
				} //Workaround, damit nicht auf ein Kaestchen ausserhalb des arrays zugegriffen wird
				
				int links = ergebnis[schritt][vgl1]; //Variable fuer Vergleich zum links stehenden Kaestchen
				int fokus = ergebnis[schritt][zelle]; //Variable fuer Vergleich mit fokussiertem Kaestchen
				int rechts = ergebnis[schritt][vgl2]; //Variable fuer Vergleich zum rechts stehenden Kaestchen
				
				
				if(  //Regeln fuer schwarze Faerbung
						links == 0 && fokus == 0 && rechts == 1|| 
						links == 0 && fokus == 1 && rechts == 0|| 
						links == 0 && fokus == 1 && rechts == 1|| 
						links == 1 && fokus == 0 && rechts == 0
						){
					ergebnis[schritt+1][zelle] = 1; //Einfaerbung des Kaestchens in der naechsten Zeile
					}
				
					else if( //Regeln fuer weisse Faerbung
						links == 0 && fokus == 0 && rechts == 0|| 
						links == 1 && fokus == 0 && rechts == 1|| 
						links == 1 && fokus == 1 && rechts == 0|| 
						links == 1 && fokus == 1 && rechts == 1
						){
					ergebnis[schritt+1][zelle] = 0;	//Einfaerbung des Kaestchens in der naechsten Zeile
				}	
			}	
		}
	}
	
	public int[][] getErgebnis() {
		return this.ergebnis;
	}
	
	public int getBreite() {
		return this.breite;
	}
	
	public int getHoehe() {
		return this.hoehe;
	}
}